﻿using System;
using System.Collections.Generic;
using System.Text;

namespace LocalizationTest.Tools
{
  public enum LandmarkSelectionStrategy
  {
    all,
    intelligent,
    contributionBased,
    lastN,
    lastNOfEach,
    lastAndFirstOfEachInLastN
  };
  public enum Metrik
  {
    euclidian,
    taxi,
    mahananobis
  }
  public enum WeightingType
  {
    allEqual,
    indexPowerN
  }

  public enum NoiseType
  {
    noNoise, gaussianNoSystematic, noGaussianButSystematic, gaussianAndSystematic, equal
  }

  public class SelfLocatorProperties
  {
    private LandmarkSelectionStrategy selectionStrategy;
    private WeightingType typeOfLandmarkWeighting;
    private Metrik usedMetrik;
    private NoiseType motionNoise;
    private NoiseType sensorNoise;
    private int _lastN;
    private int _indexPowerN;
    private int _nOfSubsequentObservations;
    private int _maxGapForBlocks;
    private int _minSizeForBlocks;
    private int _maxNumberOfObservations;

    public LandmarkSelectionStrategy SelectionStrategy
    {
      get { return selectionStrategy; }
      set { selectionStrategy = value; }
    }
    public WeightingType TypeOfLandmarkWeighting
    {
      get { return typeOfLandmarkWeighting; }
      set { typeOfLandmarkWeighting = value; }
    }
    public Metrik UsedMetrik
    {
      get { return usedMetrik; }
      set { usedMetrik = value; }
    }
    public NoiseType MotionNoise
    {
      get { return motionNoise; }
      set { motionNoise = value; }
    }
    public NoiseType SensorNoise
    {
      get { return sensorNoise; }
      set { sensorNoise = value; }
    }
    public int _ParamLastN
    {
      get { return _lastN; }
      set { _lastN = value; }
    }
    public int _IndexPowerN
    {
      get { return _indexPowerN; }
      set { _indexPowerN = value; }
    }
    public int _NOfSubsequentObservations
    {
      get { return _nOfSubsequentObservations; }
      set { _nOfSubsequentObservations = value; }
    }
    public int _MaxGapForBlocks
    {
      get { return _maxGapForBlocks; }
      set { _maxGapForBlocks = value; }
    }
    public int _MinSizeForBlocks
    {
      get { return _minSizeForBlocks; }
      set { _minSizeForBlocks = value; }
    }
    public int _MaxNumberOfObservations
    {
      get { return _maxNumberOfObservations; }
      set { _maxNumberOfObservations = value; }
    }

    public SelfLocatorProperties()
    {
      selectionStrategy = LandmarkSelectionStrategy.lastAndFirstOfEachInLastN;
      _lastN = 50;
      _indexPowerN = 5;
      _nOfSubsequentObservations = 1;
      _maxGapForBlocks = 3;
      _minSizeForBlocks = 5;
      _maxNumberOfObservations = 3;
      
      typeOfLandmarkWeighting = WeightingType.allEqual;
      usedMetrik = Metrik.euclidian;
      motionNoise = NoiseType.gaussianAndSystematic;
      sensorNoise = NoiseType.gaussianNoSystematic;
    }
  }
}
